package com.ssm.util;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * Created by Lenovo on 2019-10-18.
 */

@Component  //定义Advice类的对象advice
@Aspect      //定义当前类为一个切面
public class Advice {
    //定义该方法是一个前置方法，切点是Math类的所有方法。
    @Before("execution(* com.ssm.util.Math.a*(..))")
    public void before(){
        System.out.println("-----before advice---------");
    }
    //定义该方法是一个后置方法，切点是标识了@MyAnno注解的所有方法。
    @After("@annotation(com.ssm.util.MyAnno)")
    public void after(JoinPoint joinPoint)
    {
        System.out.println("----MyAnno  advice------");
        System.out.println(joinPoint.getSignature().getName());
    }
    @Around("execution(* com.ssm.util.Math.m*(..))")
    private Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("-----around().invoke-----");
        System.out.println(" 类似于Before Advice的操作");
        //调用核心逻辑
        Object retVal = pjp.proceed();
        System.out.println(" 类似于After Advice的操作");
        System.out.println("-----End of around()------");
        return retVal;
    }
}